package com.beta.cust.bind.datasync.http;

import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import com.beta.cust.bind.datasync.config.CfgSelfRefreshBean;
import com.beta.cust.bind.datasync.constant.BusinessConstant;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.net.InetSocketAddress;
import java.net.Proxy;
import java.util.Map;

/**
 * @Author：chenlei
 * @Date：2024/3/13 19:08
 */
@Data
@Slf4j
@Service
public class HttpService {

    @Autowired
    private CfgSelfRefreshBean cfgSelfRefreshBean;

    /**
     * post请求
     *
     * @param url   -> 请求地址 -> 是否必须:是
     * @param param -> 请求参数 -> 是否必须:否
     */
    public String post(String url, Map<String, Object> param) {
        HttpRequest request = HttpRequest.post(url).timeout(BusinessConstant.HUTOOL_TIMEOUT);

        if (MapUtil.isNotEmpty(param)) {
            request.form(param);
        }

        // 有开启代理
        if (StrUtil.equals("Y", cfgSelfRefreshBean.getProxyEnable())) {
            enableProxyMethod(request);
        }

        return request.execute().body();

    }

    /**
     * 开启代理
     *
     * @param request -> 请求 -> 是否必须:是
     */
    public void enableProxyMethod(HttpRequest request) {
        String proxyType = cfgSelfRefreshBean.getProxyType();
        // http代理
        if (StrUtil.equals("http", proxyType)) {
            this.setProxyMethod(request, Proxy.Type.HTTP);
        }
        // socket代理
        if (StrUtil.equals("socket", proxyType)) {
            this.setProxyMethod(request, Proxy.Type.SOCKS);
        }
    }

    /**
     * 设置代理
     *
     * @param request   -> 请求 -> 是否必须:是
     * @param proxyType -> 代理类型 -> 是否必须:是
     */
    private void setProxyMethod(HttpRequest request, Proxy.Type proxyType) {

        // 代理有账号和密码
        if (StrUtil.equals("Y", cfgSelfRefreshBean.getProxyAuthorize())) {
            setProxyHostAndPort(request, proxyType);
            setProxyUsernameAndPasswordMethod();
            return;
        }

        // 代理没有账号和密码
        if (StrUtil.equals("N", cfgSelfRefreshBean.getProxyAuthorize())) {
            setProxyHostAndPort(request, proxyType);
        }
    }

    /**
     * 设置代理的账号和密码
     */
    private void setProxyUsernameAndPasswordMethod() {
        // 待做,下面代码写的不对
    }

    /**
     * 设置代理的地址和端口
     *
     * @param request   -> 请求 -> 是否必须:是
     * @param proxyType -> 代理类型 -> 是否必须:是
     */
    private void setProxyHostAndPort(HttpRequest request, Proxy.Type proxyType) {
        request.setProxy(new Proxy(proxyType, new InetSocketAddress(cfgSelfRefreshBean.getProxyHost(), cfgSelfRefreshBean.getProxyPort())));
    }


    /**
     * post请求
     *
     * @param url   -> 请求地址 -> 是否必须:是
     * @param param -> 请求参数 -> 是否必须:否
     */
    public String post(String url, String param) {

        HttpRequest request = HttpRequest.post(url).timeout(BusinessConstant.HUTOOL_TIMEOUT);

        if (StrUtil.isNotBlank(param)) {
            request.body(param);
        }

        // 有开启代理
        if (StrUtil.equals("Y", cfgSelfRefreshBean.getProxyEnable())) {
            enableProxyMethod(request);
        }
        return request.execute().body();

    }

    /**
     * get请求
     *
     * @param url   -> 请求地址 -> 是否必须:是
     * @param param -> 请求参数 -> 是否必须:否
     */
    public String get(String url, Map<String, Object> param) {

        HttpRequest request = HttpRequest.get(url).timeout(BusinessConstant.HUTOOL_TIMEOUT);

        if (MapUtil.isNotEmpty(param)) {
            request.form(param);
        }

        // 有开启代理
        if (StrUtil.equals("Y", cfgSelfRefreshBean.getProxyEnable())) {
            enableProxyMethod(request);
        }

        return request.execute().body();

    }
}